한 상점에는 여러 종류의 과일이 있습니다.
각 과일에는 가격이 적혀 있으며, 같은 종류의 과일이 여러 개 있을 수 있습니다.
상점 주인은 3개의 과일을 골라 합산 가격을 기록하려고 합니다.
기록된 모든 합 중에서 K번째로 높은 가격을 구하세요.
만약 K번째 가격이 존재하지 않으면 -1을 출력합니다.
let n = 7, k = 4;
let prices = [1200, 1500, 900, 2000, 800, 1500, 1000];
4200
function solution(n, k, prices){
prices.sort((a, b) => b - a); // 내림차순 정렬
let count = 0;
let answer;
for(let i=0; i<n-2; i++){
for(let j=i+1; j<n-1; j++){
for(let s=j+1; s<n; s++){
count++; // 단순히 조합 수를 세어 K번째가 나오면 반환
if(count === k){
answer = prices[i]+prices[j]+prices[s];
break;
}
}
}
}
return answer;
}
count++
가 계속 증가 → 실제 K번째 큰 값이 아님[5,5,5,3]
같은 경우, 15가 여러 번 세어지면서 K번째 값이 틀릴 수 있음
function solution(n, k, prices) {
let sums = new Set();
for (let i = 0; i < n - 2; i++) {
for (let j = i + 1; j < n - 1; j++) {
for (let s = j + 1; s < n; s++) {
sums.add(prices[i] + prices[j] + prices[s]); // 중복 제거
}
}
}
// Set을 Array로 변환 후 내림차순 정렬
let sorted = Array.from(sums).sort((a, b) => b - a);
// K번째 값이 존재하면 반환, 없으면 -1
return sorted[k - 1] ?? -1;
}
// 테스트
let n = 7, k = 4;
let prices = [1200, 1500, 900, 2000, 800, 1500, 1000];
console.log(solution(n, k, prices));